package com.szh.zx.java8.day01;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * java8 内置的四大核心函数式接口。
 * Consumer<T> :消费性接口
 * void accept（T t）
 * Supplier<T> :供给型接口
 * T get（）；
 * Function（） 函数型接口
 * R apply（T t）
 * predicate<T> 断言型接口
 * boolean test(T t)
 */
public class TestLambda4 {
	// 消费性接口
	public void happy(double money, Consumer<Double> consumer) {
		consumer.accept(money);
	}

	
	public void test1() {
		happy(1000, (m) -> System.out.println("大保健啦啦啦"));
	}

	// 供给型接口
	// 需求：产生一些整数，并放入集合中
	public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < num; i++) {
			Integer n = supplier.get();
			list.add(n);
		}
		return list;
	}

	// 测试供给型接口
	
	public void test2() {
		List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
		for (Integer integer : numList) {
			System.out.println(integer);
		}
	}

	// 函数型接口
	// 需求：写个方法专门处理字符串
	public String strHandler(String s, Function<String, String> function) {
		return function.apply(s);
	}

	// 测试函数型接
	
	public void test3() {
		String s = strHandler("/t/t/t 是尼克斯", (str) -> str.trim());
		System.out.println(s);
		// 其他字符串操作

	}

	// 断言型接口
	// 需求： 将满足条件的字符串，放入集合
	public List<String> filterStr(List<String> list, Predicate<String> pre) {
		List<String> stringList = new ArrayList<>();
		for (String s : stringList) {
			if (pre.test(s)) {
				stringList.add(s);
			}
		}
		return stringList;
	}

	// 测试断言型接口
	
	public void test4() {
		List<String> list = Arrays.asList("hello", "fjc", "djfocfc");
		List<String> filterStr = filterStr(list, (s) -> s.length() > 3);
		for (String s : filterStr) {
			System.out.println(s);
		}
	}
}
